//高阻输入
#define  P0_MODE_IN_HIZ(Pin)			P0M1 |= (Pin), P0M0 &= ~(Pin);
#define  P1_MODE_IN_HIZ(Pin)			P1M1 |= (Pin), P1M0 &= ~(Pin);
#define  P2_MODE_IN_HIZ(Pin)			P2M1 |= (Pin), P2M0 &= ~(Pin);
#define  P3_MODE_IN_HIZ(Pin)			P3M1 |= (Pin), P3M0 &= ~(Pin);
#define  P4_MODE_IN_HIZ(Pin)			P4M1 |= (Pin), P4M0 &= ~(Pin);
#define  P5_MODE_IN_HIZ(Pin)			P5M1 |= (Pin), P5M0 &= ~(Pin);
#define  P6_MODE_IN_HIZ(Pin)			P6M1 |= (Pin), P6M0 &= ~(Pin);
#define  P7_MODE_IN_HIZ(Pin)			P7M1 |= (Pin), P7M0 &= ~(Pin);
//========================================================================
void  delay_ms(u16 ms)
{
	u16 i;
	do
	{
		i = MAIN_Fosc / 10000;
		while(--i)	;
	}while(--ms);
}

void  delay_us(u16 us)  //10us延时相对较准，参数为20对应18us,使用时需要现调
{
	u16 i;
	for(i=0;i<us;i++)
	{		
		_nop_ ();
	}
}
//========================================================================
u16	xdata TK_cnt[5];	// 键计数值
u16	xdata TK_zero[5];	// 0点读数 
// u16	KeyState;		//键状态
// u8	KeyCode;		//键码 1~16
bit	B_TK_Lowpass;	//允许低通
bit	B_ReadKeyOk;	//标志已转换完成16个键
u8	TrigLimit;		//触发转换限时
// u8	KeyValue;		//显示参数的键号, 0~15
u8	read_cnt;
//========================================================================
void Touch_Key_Init(void)
{
	u8	i;
	
	//1. TouchKey配置为高阻状态
	//配置P14为高阻状态
	P1_MODE_IN_HIZ(0x10);
	
	TSRT = 0x00;		               //没有LED分时扫描
	//2. 触摸按键对应使能位，对应位置配置为1则相应的TKn管脚为触摸按键，配置为0则相应的TKn管脚为GPIO。
	//仅使用了TK4
	TSCHEN1 = 0x10;		//TK0~TK7
	TSCHEN2 = 0x00;		//TK8~TK15
	
	//3. 配置开关电容工作频率，内部Cref起始对地放电时间，内部参考电压
	TSCFG1  = (7<<4) + 6;	//开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
	TSCFG2  = 1;		//配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
	
	//4. 触摸按键中断
	IE2 |= 0x80;		//允许触摸按键中断
	EA = 1;				//总中断
	
	delay_ms(50);//预留设置的时间
	B_TK_Lowpass = 0;	//禁止低通滤波
//	B_TK_Lowpass = 1;	//允许低通滤波
	
	//5. 上电先读取，每次上电的电容可能不一样
	for(read_cnt=0; read_cnt<40; read_cnt++)		//读40次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
	{
	//	TSCTRL = (1<<7) + (1<<6) +3;	//开始扫描, 4次平均, 读数大约为无平均的一半
		TSCTRL = (1<<7) + (1<<6) +1;	//开始扫描, 2次平均, 读数大约为无平均的一半
	//	TSCTRL = (1<<7) + (1<<6);		//开始扫描, 只转换1次, 无平均
		//等待扫描完成，最长等待100ms
		B_ReadKeyOk = 0;
		for(i=0; i<100; i++)
		{
			if(B_ReadKeyOk)	break;
			delay_ms(1);
		}
	}
	//6. 保存采集到的触摸按键的值
	for(i=0; i<5; i++)		TK_zero[i] = TK_cnt[i];	//保存0点，只用了通道4
	
	B_TK_Lowpass = 1;	//允许低通
	// KeyState = 0;
	read_cnt = 0;
	
	B_ReadKeyOk = 0;
	// KeyValue = 10;
	// KeyCode = 0;
}

void Read_TouchKey()
{
	delay_ms(1);
	//Voice_play(0x1f);
	//while(1);
	
	if(++TrigLimit >= 100)	//触发转换
	{
		TrigLimit = 0;
	//	TSCTRL = (1<<7) + (1<<6) +3;	//开始扫描, 4次平均, 读数大约为无平均的一半
		TSCTRL = (1<<7) + (1<<6) +1;	//开始扫描, 2次平均, 读数大约为无平均的一半
	//	TSCTRL = (1<<7) + (1<<6);		//开始扫描, 只转换1次, 无平均
	}
	
	if(B_ReadKeyOk)			// 16个键都转换完毕
	{
		B_ReadKeyOk = 0;
		TrigLimit = 100;
		//ShowValue(3);	//显示读数
		
		// for(i=0;i<4;i++)
		// {
			// if(TK_cnt[i]<1200)
			// {	
				// LoadLED_A(0,i+1);
				// ShowValue(i);
			// }
		// }
		if(TK_cnt[4] < 1200)
		{
			LED_ON();
			delay_ms(5000);
		}
		else
		{
			LED_OFF();
		}
	}
}

void AUXR_ISR(void) interrupt 13
{
	u8	j;
	
	switch(isr_index)
	{
		case 32:		//0103H 波形发生器5 中断入口
						//用户中断处理代码
		break;

		case 33:		//010BH	波形发生器异常2 中断入口
						//用户中断处理代码
		break;

		case 34:		//0113H	波形发生器异常4 中断入口
						//用户中断处理代码
		break;

		case 35:		//011BH	触摸按键 中断入口
						//用户中断处理代码
			j = TSSTA2;

			if(j & 0x40)	//数据溢出, 错误处理(略)
			{
				TSSTA2 |= 0x40;	//写1清零
			}
			if(j & 0x80)	//扫描完成
			{
				j &= 0x0f;
				TSSTA2 |= 0x80;	//写1清零

				if(!B_TK_Lowpass)	TK_cnt[j] = TSDAT/4;	//保存某个通道的读数	无低通滤波
				else				TK_cnt[j] = ((TK_cnt[j] * 3)>>2) + TSDAT/16;	//保存某个通道的读数	低通滤波
				if(j == 4)	B_ReadKeyOk = 1;	//读完一次循环，只用到了通道4
			}

		break;

		case 36:		//0123H	RTC 中断入口
						//用户中断处理代码
		break;

		case 37:		//012BH	P0口中断入口
						//用户中断处理代码
		break;

		case 38:		//0133H	P1口中断入口
						//用户中断处理代码
		break;

		case 39:		//013BH	P2口中断入口
						//用户中断处理代码
		break;

		case 40:		//0143H	P3口中断入口
						//用户中断处理代码
		break;

		case 41:		//014BH	P4口中断入口
						//用户中断处理代码
		break;

		case 42:		//0153H	P5口中断入口
						//用户中断处理代码
		break;

		case 43:		//015BH	P6口中断入口
						//用户中断处理代码
		break;

		case 44:		//0163H	P7口中断入口
						//用户中断处理代码
		break;

		case 45:		//016BH	P8口中断入口
						//用户中断处理代码
		break;

		case 46:		//0173H	P9口中断入口
						//用户中断处理代码
		break;
		
		default:
		break;
	}
}